package response

import (
	"card/constant"
	"card/pkg/logger"
	"card/pkg/myError"
	"card/pkg/util"
	"github.com/gin-gonic/gin"
	"net/http"
)

func defaultMessage(defaultMsg string, msg ...string) string {
	if len(msg) > 0 {
		return msg[0]
	}
	return defaultMsg
}

// JSON 响应 200 和 JSON 数据
func JSON(c *gin.Context, data interface{}) {
	c.JSON(http.StatusOK, data)
}

// Success 响应 200 和预设『操作成功！』的JSON 数据
// 执行某个『没有具体返回数据』的『变更』操作成功后调用，例如删除、修改密码、修改手机号
func Success(c *gin.Context, msg ...string) {
	JSON(c, gin.H{
		"message": defaultMessage("操作成功", msg...),
		"errno":   0,
	})
}

// Data 响应 200 和带 data 键的JSON 数据
// 执行『更新操作』成功后调用，例如更新话题，成功后返回已更新的数据
func Data(c *gin.Context, data interface{}, msg ...string) {
	JSON(c, gin.H{
		"message": defaultMessage("获取成功", msg...),
		"data":    data,
		"errno":   0,
	})
}

// Created 响应 201 和带 data 键的JSON 数据
// 执行『更新操作』成功后调用，成功后返回已更新的数据

func Error(c *gin.Context, err error, msg ...string) {
	if myError, ok := err.(*myError.MyError); ok {
		//表单校验
		if myError.Code < 2000 && myError.Code > 1000 {
			c.JSON(http.StatusOK, gin.H{
				"errno":   myError.Code,
				"message": err.Error(),
				"log_id":  util.GetLogId(c.Request.Context()),
			})
			return
		} else if myError.Code >= 2000 && myError.Code < 3000 {
			//500错误，不直接抛出错误
			c.JSON(http.StatusOK, gin.H{
				"errno":   myError.Code,
				"message": defaultMessage("系统错误", msg...),
				"log_id":  util.GetLogId(c.Request.Context()),
			})
			logger.LogIf(c.Request.Context(), err)
			return
		}
	} else {
		//未知的异常
		c.JSON(http.StatusOK, gin.H{
			"errno":   constant.ExceptionErrorCode,
			"message": defaultMessage("系统错误", msg...),
			"log_id":  util.GetLogId(c.Request.Context()),
		})
		logger.LogIf(c.Request.Context(), err)
		return
	}
}

func Warn(c *gin.Context, msg string) {
	c.JSON(http.StatusOK, gin.H{
		"errno":   constant.ExceptionErrorCode,
		"message": msg,
		"log_id":  util.GetLogId(c.Request.Context()),
	})
}
